home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / zako02.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  4KB  |  196 lines

  1. /* 回転するザコ */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12.  
  13. #define PALET_MAIN    0x0600
  14.  
  15.  
  16. static short points_disp;    /* 得点を表示するか */
  17.  
  18. static short EnemyMoveZako02 (ENEMY *);
  19. static void EnemyTiniZako02 (ENEMY *);
  20.  
  21. enum {
  22.     APPEAR_LEFT = 0, APPEAR_RIGHT
  23. };
  24.  
  25.  
  26.  
  27. /* ゲーム開始時に1回だけ呼ばれる */
  28. void EnemyInitStaticZako02 (void)
  29. {
  30.     points_disp = 0;
  31. }
  32.  
  33.  
  34.  
  35. void EnemyInitZako02 (ENEMY * p)
  36. {
  37.     /* 常にプレイヤーの反対側から現れる */
  38.     /* X座標は画面端からの相対値 */
  39.     if (player->x > 144) {
  40.         p->vx = 3 * 65536;
  41.         p->lx = -16 * 65536 - p->lx;
  42.         p->cwork = APPEAR_LEFT;
  43.     } else {
  44.         p->vx = -3 * 65536;
  45.         p->lx = (256 + 16) * 65536 + p->lx;
  46.         p->cwork = APPEAR_RIGHT;
  47.     }
  48.     p->vy = -3 * 65536;
  49.     p->pt = obj_zako02;
  50.     p->hit_px = 8;
  51.     p->hit_py = 12;
  52.     p->hit_sx = 12;
  53.     p->hit_sy = 12;
  54.     p->damage = 0;
  55.     p->damage_core = 0;
  56.     p->hp = 1;
  57.     p->seq = 0;
  58.     p->info = PALET_MAIN | PRIORITY_ZAKO;
  59.     p->core_pt = sp_core01 + 1;
  60.     p->func_enemy_move = EnemyMoveZako02;
  61.     p->func_enemy_tini = EnemyTiniZako02;
  62. }
  63.  
  64.  
  65.  
  66. static short EnemyMoveZako02 (ENEMY * p)
  67. {
  68.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  69.     p->x = (p->lx += p->vx) >> 16;
  70.     p->y = (p->ly += p->vy) >> 16;
  71.  
  72.  
  73.     switch (p->seq) {
  74.     case 0:
  75.         p->pt++;
  76.         p->vy += 8192;
  77.         if (p->vy > 0) {
  78.             p->seq++;
  79.             p->vy = 4096;
  80.             p->s_work = 0;    /* ショット用カウンター */
  81.         }
  82.         break;
  83.  
  84.         /* しばらく停滞 */
  85.     case 1:
  86.         p->pt++;
  87. #define SPEED_SHOT1_1    10
  88.         switch (p->s_work++) {
  89.         case 2:
  90.             {
  91.                 char a = psearch (p->x, p->y);
  92.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT1_1 - 2, a, 0);
  93.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT1_1, a, 0);
  94.                 SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  95.             }
  96.             break;
  97.         case 14:
  98.             p->seq++;
  99.             p->s_work = 0;
  100. #define SPEED_1        24    /* 加速度 */
  101. #define SPEED_1N    28    /* 加速度を足す回数 */
  102.             if (p->cwork == 0)
  103.                 SubEnemyMoveToInit (p, SHORT_LX - 32, SHORT_LY + 128, SPEED_1, SPEED_1N);
  104.             else
  105.                 SubEnemyMoveToInit (p, SHORT_LX + 32, SHORT_LY + 128, SPEED_1, SPEED_1N);
  106.             break;
  107.         default:
  108.             break;
  109.         }
  110.         if (p->vx > 0)
  111.             p->vx -= 8192;
  112.         else
  113.             p->vx += 8192;
  114.         break;
  115.  
  116.         /* 逃げる */
  117.     case 2:
  118.         p->pt++;
  119.         /* 設定値に従って移動 */
  120.         if (SubEnemyMoveTo (p) < 0) {
  121.             p->seq++;
  122.             if (p->cwork == 0)
  123.                 SubEnemyMoveToInit (p, SHORT_LX + 32, SHORT_LY + 256, SPEED_1, SPEED_1N);
  124.             else
  125.                 SubEnemyMoveToInit (p, SHORT_LX - 32, SHORT_LY + 256, SPEED_1, SPEED_1N);
  126.         }
  127.         /* 攻撃処理 */
  128. #define INTERVAL2_1    35
  129.         switch (p->s_work++) {
  130.         case 1 + INTERVAL2_1 * 0:
  131.         case 1 + INTERVAL2_1 * 1:
  132.             {
  133.                 char a = psearch (p->x, p->y);
  134.                 EshotInit (ESHOT_NRG02, SHORT_LX, SHORT_LY, SPEED_SHOT1_1 - 2, a, 0);
  135.                 EshotInit (ESHOT_NRG03, SHORT_LX, SHORT_LY, SPEED_SHOT1_1, a, 0);
  136.                 SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  137.             }
  138.             break;
  139.         }
  140.         break;
  141.  
  142.     case 3:
  143.         p->pt++;
  144.         if (SubEnemyMoveTo (p) < 0)
  145.             SubEnemyMoveToInit (p, SHORT_LX, SHORT_LY + 128, SPEED_1, SPEED_1N);
  146.         break;
  147.     default:
  148.         break;
  149.     }
  150.     if (p->pt > obj_zako02 + 15)
  151.         p->pt -= 15;
  152.  
  153.     /* 画面外に出たら消去 */
  154.     if (SHORT_LY > 256 + 32)
  155.         return (-1);    /* 消去 */
  156.  
  157.  
  158.     /* 自機ショットに当たった時の処理 */
  159.     /* ザコは一撃で死ぬのでコア云々は考慮しなくて良い */
  160.     if (p->damage) {
  161.         EffectInit (EFFECT_EXPLZAKO, 0, p->x, p->y);
  162.         SoundSetSE (SE_EXPL);
  163.         if (points_disp < ZAKO_SCORE_DISP) {
  164.             points_disp++;
  165.             if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  166.                 EffectInit (EFFECT_POINTS_RED, POINTS_200, p->x, p->y);
  167.             else
  168.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_100, p->x, p->y);
  169.         } else {
  170.             if (p->core_info == (PALET_CORE_RED | PRIORITY_ZAKO))
  171.                 EffectInit (EFFECT_POINTS, POINTS_200, p->x, p->y);
  172.             else
  173.                 EffectInit (EFFECT_POINTS, POINTS_100, p->x, p->y);
  174.         }
  175.         return (-1);    /* 消去 */
  176.     }
  177.     xobj_set_st (p);
  178.  
  179.     /* コアの表示 */
  180.     p->core_x = p->x - 8;
  181.     p->core_y = p->y - 8;
  182.     if (player->y < p->y + 64)    /* 自機との座標の差が小さければ赤 */
  183.         p->core_info = PALET_CORE_BLUE | PRIORITY_ZAKO;
  184.     else
  185.         p->core_info = PALET_CORE_RED | PRIORITY_ZAKO;
  186.     xsp_set_st (&(p->core_x));
  187.  
  188.     return (0);
  189. }
  190.  
  191.  
  192.  
  193. static void EnemyTiniZako02 (ENEMY * p)
  194. {
  195. }
  196.